package app;

import callback.impl.FileSave2DB;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import task.FileScanner;
import task.FileSearch;
import util.DBInit;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

/**
 * @author yuisama
 * @date 2022/07/06 15:07
 **/
public class Controller implements Initializable {

    @FXML
    private GridPane rootPane;

    @FXML
    private TextField searchField;//搜索栏

    @FXML
    private TableView<FileMeta> fileTable;

    @FXML
    private Label srcDirectory;//选择目录栏


    private Thread scanThread;//中断线程
    /**
     * 界面的初始化方法，在界面刚加载时，将所有要初始化的部分全都在界面加载完成之前完成
     * @param location
     * The location used to resolve relative paths for the root object, or
     * <tt>null</tt> if the location is not known.
     *
     * @param resources
     * The resources used to localize the root object, or <tt>null</tt> if
     * the root object was not localized.
     */
    public void initialize(URL location, ResourceBundle resources) {
        //数据库的初始化,在页面加载完成时
        DBInit.init();
        // 添加搜索框监听器，内容改变时执行监听事件
        searchField.textProperty().addListener(new ChangeListener<String>() {

            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                freshTable();
            }
        });
    }

    /**
     * 当鼠标点击选择目录时，就会就会获得最终界面的选择文件夹
     * @param event
     */
    public void choose(Event event) {
        // 选择文件目录
        DirectoryChooser directoryChooser=new DirectoryChooser();
        Window window = rootPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null)
            return;
        // 获取选择的目录路径，并显示
        String path = file.getPath();
        //将选择的文件路径显示到界面中
        this.srcDirectory.setText(path);
        //获取要扫描的文件夹路径之后，进行文件的扫描工作
        System.out.println("开始进行文件扫面任务，根路径为：" + path);
        //回调函数，传入保存数据到数据库的对象
        FileScanner fileScanner = new FileScanner(new FileSave2DB());
        if (scanThread != null){//如果中断线程已经存在，那么就中断当前线程
            scanThread.interrupt();
        }
        //重新创建线程，扫描文件
        scanThread = new Thread(() -> {
            fileScanner.scan(file);
            // TODO 刷新界面，将刚才扫描的信息保存到界面
            freshTable();
        });
        scanThread.start();
    }

    // 刷新表格数据
    private void freshTable(){
        //该方法传入FileMeta对象，将meta对象的属性展示在页面的表格中
        ObservableList<FileMeta> metas = fileTable.getItems();
        metas.clear();
        // TODO 如果fileMetas不为空，将所有的meta对象的属性添加到metas中，展示在页面上
        String dir = srcDirectory.getText();//将选择的文件的路径展示再页面上
        if (dir != null && dir.trim().length() != 0){
            //从数据库中查询数据，保存到内存中，再将数据展示到页面中
            String content = searchField.getText();
            List<FileMeta> filesFromDB = FileSearch.search(dir,content);//搜索dir路径下的输入的文本内容
            metas.addAll(filesFromDB);//将所有的数据展示再页面中
        }
    }

}